home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 551-575 / disk_551 / toolmanager / source / hotkeyswindow.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  7KB  |  292 lines

  1. /*
  2.  * hotkeyswindow.c   V1.5
  3.  *
  4.  * HotKeys list window
  5.  *
  6.  * (c) 1991 by Stefan Becker
  7.  *
  8.  */
  9. #include "ToolManager.h"
  10.  
  11. /* Structures for window */
  12. static char WindowTitle[]=DEFPROGNAME " HotKey List"; /* Window title */
  13. extern struct NewWindow nw;
  14. static struct Window *w;
  15. static struct MsgPort *wp;
  16. static ULONG wh,ww;                       /* Window height, width */
  17. static struct Screen *pubsc;              /* Workbench screen */
  18.  
  19. /* Structures for window gadgets */
  20. static void *vi;             /* Visual information is a *PRIVATE* data field! */
  21. extern struct GfxBase *GfxBase;
  22. static struct TextAttr ta={NULL,0,0,0};
  23. static struct Gadget *gl;    /* Gadget list */
  24. static struct Gadget *lvgad;
  25.  
  26. /* miscellaneous */
  27. static struct List HotKeysList;
  28. static struct HotKeyNode {
  29.                           struct Node      hkn_Node;
  30.                           struct ToolNode *hkn_ToolNode; /* Pointer to tool */
  31.                          };
  32.  
  33. /* Free one HotKeyNode */
  34. static void FreeHotKeyNode(struct HotKeyNode *hkn)
  35. {
  36.  /* Remove node from list */
  37.  Remove((struct Node *) hkn);
  38.  
  39.  /* Free memory */
  40.  free(hkn->hkn_Node.ln_Name);
  41.  free(hkn);
  42. }
  43.  
  44. /* Free HotKeys list */
  45. static void FreeHotKeysList(void)
  46. {
  47.  struct HotKeyNode *hkn1,*hkn2=GetHead(&HotKeysList); /* Begin of list */
  48.  
  49.  while (hkn1=hkn2)
  50.   {
  51.    hkn2=GetSucc((struct ToolNode *) hkn1);
  52.    FreeHotKeyNode(hkn1);
  53.   }
  54. }
  55.  
  56. /* Build one HotKeyNode */
  57. static BOOL BuildHotKeyNode(struct ToolNode *tn)
  58. {
  59.  struct HotKeyNode *hkn;
  60.  char *tnp,*hkp,*np;
  61.  
  62.  /* Get memory for the node */
  63.  if (!(hkn=malloc(sizeof(struct HotKeyNode)))) return(FALSE);
  64.  
  65.  /* Get memory for node name */
  66.  tnp=tn->tn_Node.ln_Name;
  67.  hkp=tn->tn_HotKey;
  68.  if (!(np=malloc(strlen(tnp)+strlen(hkp)+4)))
  69.   {
  70.    free(hkn);
  71.    return(FALSE);
  72.   }
  73.  
  74.  /* Build node name */
  75.  strcpy(np,hkp);
  76.  strcat(np," : ");
  77.  strcat(np,tnp);
  78.  
  79.  /* Initialize node */
  80.  hkn->hkn_Node.ln_Name=np;
  81.  hkn->hkn_ToolNode=tn;
  82.  
  83.  /* Add node to the list */
  84.  AddHead(&HotKeysList,(struct Node *) hkn);
  85.  return(TRUE);
  86. }
  87.  
  88. /* Build list of all available HotKeys */
  89. static BOOL BuildHotKeysList(void)
  90. {
  91.  struct ToolNode *tn,tmtn;
  92.  
  93.  /* Initialize HotKeys list */
  94.  NewList(&HotKeysList);
  95.  
  96.  /* Add ToolManager pop up HotKey */
  97.  tmtn.tn_Node.ln_Name=MyName;
  98.  tmtn.tn_HotKey=PopUpHotKey;
  99.  if (!BuildHotKeyNode(&tmtn)) return(FALSE);
  100.  
  101.  /* Scan tool list */
  102.  tn=GetHead(&ToolList); /* Begin of list */
  103.  while (tn)
  104.   {
  105.    /* Does the tool have a HotKey? Yes, add a new HotKeyNode */
  106.    if (tn->tn_CxObj && !BuildHotKeyNode(tn))
  107.     {
  108.      FreeHotKeysList();
  109.      return(FALSE);
  110.     }
  111.  
  112.    tn=GetSucc(tn); /* Next in list */
  113.   }
  114.  
  115.  return(TRUE);
  116. }
  117.  
  118. /* Create gadgets */
  119. static BOOL CreateGadgets(void)
  120. {
  121.  struct NewGadget ng;
  122.  struct Gadget *g;
  123.  struct TextFont *f;
  124.  UWORD topborder;
  125.  char buf[BUFLEN];
  126.  
  127.  if (!(f=OpenFont(pubsc->Font))) goto cge1; /* Open window font */
  128.  topborder=pubsc->WBorTop+f->tf_YSize+1;    /* Top border offset */
  129.  CloseFont(f);                              /* Close font */
  130.  
  131.  f=GfxBase->DefaultFont;                    /* System Default Font */
  132.  ta.ta_Name=f->tf_Message.mn_Node.ln_Name;
  133.  ta.ta_YSize=f->tf_YSize;
  134.  
  135.  /* Create gadget list */
  136.  gl=NULL;
  137.  g=CreateContext(&gl);
  138.  
  139.  /* Calculate window values */
  140.  ww=50*f->tf_XSize+INTERWIDTH;
  141.  
  142.  /* 1. Gadget: ListView, HotKeys */
  143.  ng.ng_LeftEdge=pubsc->WBorLeft+INTERWIDTH/2;
  144.  ng.ng_TopEdge=topborder+INTERHEIGHT;
  145.  ng.ng_Width=ww-INTERWIDTH;
  146.  ng.ng_Height=10*f->tf_YSize+INTERHEIGHT;
  147.  ng.ng_GadgetText=NULL;
  148.  ng.ng_GadgetID=0;
  149.  ng.ng_TextAttr=&ta;
  150.  ng.ng_Flags=PLACETEXT_IN;
  151.  ng.ng_VisualInfo=vi;
  152.  ng.ng_UserData=0;
  153.  if (!(lvgad=g=CreateGadget(LISTVIEW_KIND,g,&ng,
  154.                             GTLV_Labels,&HotKeysList,
  155.                             GTLV_ReadOnly,TRUE,
  156.                             TAG_DONE)))
  157.   goto cge2;
  158.  
  159.  /* Calculate window height */
  160.  wh=ng.ng_TopEdge+g->Height-topborder+INTERHEIGHT;
  161.  return(TRUE);
  162.  
  163.  /* Something went wrong... */
  164. cge2: FreeGadgets(gl);
  165. cge1: return(FALSE);
  166. }
  167.  
  168. /* Open HotKeys window */
  169. void OpenHotKeysWindow(ULONG left, ULONG top)
  170. {
  171.  
  172.  if (hkeywinsig) return;                  /* Already opened? */
  173.  
  174.  if (!(pubsc=LockPubScreen(WBScreenName))) /* Lock Workbench screen */
  175.   goto ow1;
  176.  
  177.  if (!(vi=GetVisualInfo(pubsc,TAG_DONE))) /* Get visual information */
  178.   goto ow2;
  179.  
  180.  if (!BuildHotKeysList())                 /* Build list of all HotKeys */
  181.   goto ow3;
  182.  
  183.  if (!CreateGadgets())                    /* Create Gadgets */
  184.   goto ow4;
  185.  
  186.  /* Open window */
  187.  if (!(w=OpenWindowTags(&nw,
  188.                         WA_Left,left-INTERWIDTH,
  189.                         WA_Top,top+20,
  190.                         WA_InnerWidth,ww,
  191.                         WA_InnerHeight,wh,
  192.                         WA_RMBTrap,TRUE,
  193.                         WA_Title,WindowTitle,
  194.                         WA_PubScreen,pubsc,
  195.                         WA_AutoAdjust,TRUE,
  196.                         TAG_DONE)))
  197.   goto ow5;
  198.  
  199.  wp=w->UserPort; /* Retrieve window port */
  200.  
  201.  /* Add gadget list to window */
  202.  AddGList(w,gl,(UWORD) -1,(UWORD) -1,NULL);
  203.  RefreshGList(gl,w,NULL,(UWORD) -1);
  204.  GT_RefreshWindow(w,NULL);
  205.  
  206.  /* Window open! */
  207.  UnlockPubScreen(NULL,pubsc);
  208.  hkeywinsig=1L<<wp->mp_SigBit;
  209.  globalsigs|=hkeywinsig;
  210.  return;
  211.  
  212.  /* Something went wrong.... */
  213. ow5: FreeGadgets(gl);
  214. ow4: FreeHotKeysList();
  215. ow3: FreeVisualInfo(vi);
  216. ow2: UnlockPubScreen(NULL,pubsc);
  217. ow1: return;
  218. }
  219.  
  220. /* Close HotKeys window */
  221. void CloseHotKeysWindow(void)
  222. {
  223.  if (hkeywinsig)
  224.   {
  225.    CloseWindow(w);
  226.    FreeGadgets(gl);
  227.    FreeHotKeysList();
  228.    FreeVisualInfo(vi);
  229.    globalsigs&=~hkeywinsig;
  230.    hkeywinsig=0;
  231.   }
  232. }
  233.  
  234. /* Refresh HotKeys window */
  235. void RefreshHotKeysWindow(struct ToolNode *tn, BOOL add)
  236. {
  237.  /* Is the window open and has the tool a HotKey? */
  238.  if (hkeywinsig && tn->tn_CxObj)
  239.   {
  240.    /* Detach HotKeys list from list view gadget */
  241.    GT_SetGadgetAttrs(lvgad,w,NULL,GTLV_Labels,-1,TAG_DONE);
  242.  
  243.    /* Add or remove a Hotkey? */
  244.    if (add) BuildHotKeyNode(tn); /* Add a new one */
  245.    else
  246.     { /* Remove an old one */
  247.      struct HotKeyNode *hkn=GetHead(&HotKeysList);
  248.  
  249.      /* Find corresponding HotKeyNode */
  250.      while (hkn)
  251.       {
  252.        if (hkn->hkn_ToolNode==tn) break; /* Found it! */
  253.  
  254.        hkn=GetSucc((struct ToolNode *) hkn); /* Next in list */
  255.       }
  256.  
  257.      /* Remove node from list and free it */
  258.      if (hkn) FreeHotKeyNode(hkn);
  259.     }
  260.  
  261.    /* Attach HotKeys list to list view gadget */
  262.    GT_SetGadgetAttrs(lvgad,w,NULL,GTLV_Labels,&HotKeysList,
  263.                                   GTLV_Top,0,
  264.                                   TAG_DONE);
  265.   }
  266. }
  267.  
  268. /* Handle HotKeys window events */
  269. void HandleHotKeysWinEvent(void)
  270. {
  271.  BOOL clwin=FALSE; /* TRUE if window should be closed */
  272.  struct IntuiMessage *msg;
  273.  
  274.  while ((msg=GT_GetIMsg(wp)) /* && !clwin */)
  275.   {
  276.    switch (msg->Class)
  277.     {
  278.      case IDCMP_CLOSEWINDOW:    /* User clicked the close gadget */
  279.       clwin=TRUE;               /* Yes, close window */
  280.       break;
  281.      case IDCMP_REFRESHWINDOW:  /* Window must be refreshed */
  282.       GT_BeginRefresh(w);
  283.       GT_EndRefresh(w,TRUE);
  284.       break;
  285.     }
  286.    GT_ReplyIMsg(msg);
  287.   }
  288.  
  289.  if (clwin) CloseHotKeysWindow();
  290. }
  291.  
  292.